home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / libgutil / glshapes.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  7KB  |  348 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. #include "gl.h"
  18. #include "port.h"
  19. #include "values.h"
  20. #include "math.h"
  21. #include "glmode.h"
  22.  
  23. #define A    (-0.5)
  24. #define B    ( 0.5)
  25.  
  26. #define SIN(n)    sin( ((n)*2*M_PI)/nsides )
  27. #define COS(n)    cos( ((n)*2*M_PI)/nsides )
  28. #define sphereX(x,y)     (0.5 * SIN(x) * SIN(y))
  29. #define sphereY(x,y)     (0.5 * COS(x) * SIN(y))
  30. #define sphereZ(x,y)     (0.5 * COS(y))
  31.  
  32. #define CONESIDES    20
  33. #define CYLINDERSIDES    20
  34. #define SPHERESIDES    20
  35.  
  36. static circsides = 20;
  37.  
  38. glcircle(x,y,rad)
  39. float x, y, rad;
  40. {
  41.     int i, parity;
  42.     float angle, step;
  43.  
  44.     parity = (rad>0.0);
  45.     angle = 0.0;
  46.     step = (2.0*3.1415926535)/circsides;
  47.     glbeginfacet();
  48.     if(parity)  {
  49.         glnormal(0.0,0.0,1.0);
  50.         for(i=circsides; i>0; i--)  {
  51.         glvertex(x+rad*sin(angle),y+rad*cos(angle),0.0);
  52.         angle += step;
  53.         }
  54.     } else {
  55.         rad = -rad;
  56.         glnormal(0.0,0.0,-1.0);
  57.         for(i=circsides; i>0; i--)  {
  58.         glvertex(x+rad*sin(angle),y+rad*cos(angle),0.0);
  59.         angle -= step;
  60.         }
  61.     }
  62.     glendfacet();
  63. }
  64.  
  65. static cubeside()
  66. {
  67.     glbeginfacet();
  68.     glnormal(0.0,0.0,1.0);
  69.     glvertex(-0.5,-0.5,0.5);
  70.     glvertex( 0.5,-0.5,0.5);
  71.     glvertex( 0.5, 0.5,0.5);
  72.     glvertex(-0.5, 0.5,0.5);
  73.     glendfacet();
  74. }
  75.  
  76. glcube()
  77. {
  78.     pushmatrix();
  79.     cubeside();
  80.     rot(90.0,'x');
  81.     cubeside();
  82.     rot(90.0,'x');
  83.     cubeside();
  84.     rot(90.0,'x');
  85.     cubeside();
  86.     rot(90.0,'y');
  87.     cubeside();
  88.     rot(180.0,'y');
  89.     cubeside();
  90.     popmatrix();
  91. }
  92.  
  93. glrectoid(x1,x2,y1,y2,z1,z2)
  94. float x1,x2,y1,y2,z1,z2;
  95. {
  96.     float xmin, xmax;
  97.     float ymin, ymax;
  98.     float zmin, zmax;
  99.  
  100.     xmin = MIN(x1,x2);
  101.     xmax = MAX(x1,x2);
  102.     ymin = MIN(y1,y2);
  103.     ymax = MAX(y1,y2);
  104.     zmin = MIN(z1,z2);
  105.     zmax = MAX(z1,z2);
  106.     pushmatrix();
  107.     translate((xmin+xmax)/2.0,(ymin+ymax)/2.0,(zmin+zmax)/2.0);
  108.     scale(xmax-xmin,ymax-ymin,zmax-zmin);
  109.     glcube();
  110.     popmatrix();
  111. }
  112.  
  113. gltetrahedron(argc,argv)
  114. {
  115.     glbeginfacet();     
  116.        glvertex(A,B,A);
  117.        glvertex(B,A,A);
  118.        glvertex(A,A,B);
  119.     glendfacet();
  120.  
  121.     glbeginfacet();     
  122.        glvertex(B,A,A);
  123.        glvertex(B,B,B);
  124.        glvertex(A,A,B);
  125.     glendfacet();
  126.  
  127.     glbeginfacet();     
  128.        glvertex(B,A,A);
  129.        glvertex(A,B,A);
  130.        glvertex(B,B,B);
  131.     glendfacet();
  132.  
  133.     glbeginfacet();     
  134.        glvertex(B,B,B);
  135.        glvertex(A,B,A);
  136.        glvertex(A,A,B);
  137.     glendfacet();
  138. }
  139.  
  140. glcone()
  141. {
  142.     int i, n;
  143.     int nsides = CONESIDES;
  144.  
  145.     glbeginfacet();
  146.     for(i=0; i<nsides; i++) 
  147.        glvertex(0.5*SIN(i),0.5*COS(i),-0.5);
  148.     glendfacet();
  149.     for(i=0; i<nsides; i++) {
  150.     n = i+1;
  151.     if(n == nsides)
  152.         n = 0;
  153.     glbeginfacet();
  154.        glvertex(0.0,0.0,0.5);
  155.        glvertex(0.5*SIN(n),0.5*COS(n), -0.5);
  156.        glvertex(0.5*SIN(i),0.5*COS(i), -0.5);
  157.     glendfacet();
  158.     }
  159. }
  160.  
  161. glcylinder()
  162. {
  163.     int i, n;
  164.     int nsides = CYLINDERSIDES;
  165.     float si, sn, ci, cn;
  166.  
  167.     glbeginfacet();
  168.     glnormal(0.0,0.0,-1.0);
  169.     for(i=0; i<nsides; i++) 
  170.        glvertex(0.5*SIN(i),0.5*COS(i),-0.5);
  171.     glendfacet();
  172.     glbeginfacet();
  173.     glnormal(0.0,0.0,1.0);
  174.     for(i=nsides; i--;)
  175.        glvertex(0.5*SIN(i),0.5*COS(i),0.5);
  176.     glendfacet();
  177.     for(i=0; i<nsides; i++) {
  178.     n = i+1;
  179.     if(n == nsides)
  180.         n = 0;
  181.     glbeginfacet();
  182.         si = 0.5*SIN(i);
  183.         ci = 0.5*COS(i);
  184.         sn = 0.5*SIN(n);
  185.         cn = 0.5*COS(n);
  186.         glnormal(2*si,2*ci,0.0);
  187.         glvertex(si,ci,-0.5);
  188.         glvertex(si,ci,0.5);
  189.         glnormal(2*sn,2*cn,0.0);
  190.         glvertex(sn,cn,0.5);
  191.         glvertex(sn,cn,-0.5);
  192.     glendfacet();
  193.     }
  194. }
  195.  
  196. glsphere()
  197. {
  198.     int i, n;
  199.     int x, y;
  200.     int nx, ny;
  201.     int nsides, ysides;
  202.  
  203.     nsides = SPHERESIDES;
  204.     ysides = nsides/2;
  205.     for(x=0; x<nsides; x++) {
  206.     nx = x+1;
  207.     if(nx == nsides)
  208.         nx = 0;
  209.     for(y=0; y<ysides; y++) {
  210.         ny = y+1;
  211.         if(y==0) {
  212.         glbeginfacet();
  213.             glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
  214.             glvertex(sphereX( x,ny),sphereY( x,ny),sphereZ( x,ny));
  215.             glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
  216.         glendfacet();
  217.         } else if(ny==ysides) {
  218.         glbeginfacet();
  219.             glvertex(sphereX(nx, y),sphereY(nx, y),sphereZ(nx, y));
  220.             glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
  221.             glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
  222.         glendfacet();
  223.         } else {
  224.         glbeginfacet();
  225.             glvertex(sphereX(nx, y),sphereY(nx, y),sphereZ(nx, y));
  226.             glvertex(sphereX(nx,ny),sphereY(nx,ny),sphereZ(nx,ny));
  227.             glvertex(sphereX( x,ny),sphereY( x,ny),sphereZ( x,ny));
  228.             glvertex(sphereX( x, y),sphereY( x, y),sphereZ( x, y));
  229.         glendfacet();
  230.         }
  231.     }
  232.     }
  233. }
  234.  
  235. static int mypolymode = 1;
  236.  
  237. glbeginfacet()
  238. {
  239.     if(mypolymode) 
  240.         bgnpolygon();
  241.     else 
  242.         bgnclosedline();
  243. }
  244.  
  245. glendfacet()
  246. {
  247.     if(mypolymode) 
  248.         endpolygon();
  249.     else
  250.         endclosedline();
  251. }
  252.  
  253. setpolymode(v)
  254. int v;
  255. {
  256.    mypolymode = v;
  257. }
  258.  
  259. glvertex(x,y,z)
  260. float x, y, z;
  261. {
  262.     float v[3];
  263.  
  264.     v[0] = x;
  265.     v[1] = y;
  266.     v[2] = z;
  267.     v3f(v);
  268. }
  269.  
  270. glnormal(x,y,z)
  271. float x, y, z;
  272. {
  273.     float n[3];
  274.  
  275.     n[0] = x;
  276.     n[1] = y;
  277.     n[2] = z;
  278.     n3f(n);
  279. }
  280.  
  281. static int firsted, modechange, glmode;
  282. static int frameno;
  283.  
  284. glsetmode(cmode,val) 
  285. int cmode, val;
  286. {
  287.     if(!firsted) {
  288.     matinit();
  289.     firsted = 1;
  290.     }
  291.     if(val) 
  292.     glmode |= cmode;
  293.     else
  294.     glmode &= ~cmode;
  295.     modechange = 1;
  296. }
  297.  
  298. glgetmode()
  299. {
  300.     return glmode;
  301. }
  302.  
  303. glbeginframe()
  304. {
  305.     if(modechange) {
  306.     if(glmode & ZBUFFER)
  307.        zbuffer(1);
  308.     else
  309.        zbuffer(0);
  310.  
  311.     if(glmode & DOUBLEBUFFER) 
  312.         doublebuffer();
  313.     else
  314.         singlebuffer();
  315.  
  316.     if(glmode & RGB) 
  317.         RGBmode();
  318.     else
  319.         cmode();
  320.  
  321.     if(glmode & BACKFACE) 
  322.         backface(1);
  323.     else
  324.         backface(0);
  325.  
  326.     if(glmode & FATPOLYGONS) 
  327.         glcompat(GLC_OLDPOLYGON,1);
  328.     else
  329.         glcompat(GLC_OLDPOLYGON,0);
  330.  
  331.     gconfig();
  332.     modechange = 0;
  333.     }
  334.     if(glmode & ZBUFFER) {
  335.     zclear();
  336.     setpattern(getpattern());    /* fix GT bug */
  337.     }
  338.     if(frameno != 0 && (glmode & FADE))
  339.        nextdither();
  340. }
  341.  
  342. glendframe()
  343. {
  344.     if((glmode & DOUBLEBUFFER) && (!(glmode & INHIBITSWAP)))
  345.     swapbuffers();
  346.     frameno++;
  347. }
  348.